/*
 * TabuleiroBit.h
 *
 *  Created on: 21/09/2011
 *      Author: enikolas
 */

#ifndef TABULEIROBIT_H_
#define TABULEIROBIT_H_

#include <stdint.h>
#include "tipos.h"
#include <string>

using namespace GoKnightEnum;

class TabuleiroBit {
private:

	const static tipoTabuleiro tabuleiroVazio = 0;

	tipoTabuleiro linha[NUM_LINHAS_COLUNAS];
	tipoTabuleiro coluna[NUM_LINHAS_COLUNAS];

	tipoTabuleiro setMask[NUM_CASAS];
	tipoTabuleiro clearMask[NUM_CASAS];

	tipoTabuleiro maskAttack[NUM_PECAS][NUM_CASAS];

public:

	TabuleiroBit();

	tipoTabuleiro getLinha(Linha linha) { return this->linha[linha]; }
	tipoTabuleiro getColuna(Coluna coluna) { return this->coluna[coluna]; }
	tipoTabuleiro getSetMask(Casa mask) { return this->setMask[mask]; }
	tipoTabuleiro getClearMask(Casa mask) { return this->clearMask[mask]; }
	tipoTabuleiro getMaskAttack(Peca peca, Casa casa) { return this->maskAttack[peca][casa]; }

	tipoTabuleiro setBit(tipoTabuleiro tabuleiro, Casa casa);
	tipoTabuleiro clearBit(tipoTabuleiro tabuleiro, Casa casa);
	bool isBitSet(tipoTabuleiro tabuleiro, Casa casa);
	bool isBitClear(tipoTabuleiro tabuleiro, Casa casa);
	int popCount(tipoTabuleiro tabuleiro);
	Casa bitScanForward(tipoTabuleiro tabuleiro);

	Casa obtemCasa(Coluna coluna, Linha linha);
	void printTabuleiro(tipoTabuleiro tabuleiro);
};

#endif /* TABULEIROBIT_H_ */
